<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Vue</title>
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
  <div id="root"></div>
  <script>
    // 在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法，获取更新后的 DOM。
    var Profile = Vue.extend({
      template: '<p v-my-directive>{{firstName}} {{lastName}} aka {{alias}} {{obj.aa}}</p>',
      data: function () {
        return {
          firstName: 'Walter',
          lastName: 'White',
          alias: 'Heisenberg',
          obj: {
            a: 1
          }
        }
      }
    })

    let p = new Profile().$mount('#root');

    p.firstName = 'haha';
    console.log(p.$el.textContent === 'haha White aka Heisenberg ', 'DOM还没有更新'); // DOM还没有更新
    // nextTick 更新DOM
    // nextTick 返回一个promise对象，因此可以使用es7 async await
    Vue.nextTick(function(){
      console.log(p.$el.textContent === 'haha White aka Heisenberg ', 'DOM更新了'); // DOM更新了
    })
</script>
</body>
</html>